Git Hooks 挂载脚本
因为 VSCode 抽风,把我项目直接初始化了,所以所有写好的钩子都没有了.... 这里记录一下平时用到的脚本
钩子的名字和模板钩子的名字是一致的
pre-commit 提交之前
post-commit 提交之后
pre-rebase 变基之前
post-rewrite 替换提交记录之后
pre-push 推之前
常用的钩子
客户端 hook
- git commit 相关 hook
- pre-commit:提交前执行,可以使用 git commit --no-verify 命令跳过该 hook。
- prepare-commit-msg:在启动提交信息编辑器之前执行,用于定制提交时出现信息。可以结合提交模板使用,动态地插入信息。
- commit-msg:
- post-commit:提交过程完成后运行的 hook,不接收任何参数。
git am 相关 hook
git am 用于应用(apply)来自邮箱(mailbox)的 patch,am 正是 “apply mailbox” 的缩写。am 流程会检测 3 个 hook:
- pre-applypatch:运行于应用补丁后、产生 commit 前。因此更合理的命名可能应该是 post-applypatch-pre-commit。
- applypatch-msg:它接收单个参数:包含请求合并信息的临时文件的名字。 如果脚本返回非零值,Git 将放弃该补丁。 你可以用该脚本来确保提交信息符合格式,或直接用脚本修正格式错误。
- post-applypatch:应用补丁并产生提交之后。
其它客户端 hook
- pre-rebase:运行于 git rebase 之前,官方的例子中是用于禁止对已推送的 commit 进行 rebase 操作,这样可以防止于线上的代码库发生冲突。
- post-checkout:checkout 命令执行完成之后会调用的 hook,通常用于自动调整运行环境。
- post-merge:运行于合并操作完成之后。
- pre-auto-gc:在运行 git gc --auto 命令前执行,可以用于提醒即将进行垃圾回收,或者现在是否应当进行垃圾回收。
- post-rewrite:运行于重写提交信息的命令之前,比如 git commit --amend 之前。
- pre-push:在 push 操作前执行。
服务器端 hook
- pre-receive:接收到来自客户端的推送时最先调用的 hook,可以用户阻止“non-fast-forward” 的更新,或者进行文件访问控制。
- update:类似 pre-receive,不过在同时推送多个分支时 pre-receive 仅仅运行一次,update 会每个分支执行一次。
- post-update:运行于整个接收服务完成之后。
使用 Powershell 脚本
迁移当前项目的所有文件到另一个目录里面
编写一个 hook,注意第一行一定要写,虽然不是 Linux 运行环境,但是 Git 模拟了它判断运行脚本的机制,这里通过第一行指明是用的啥执行这个脚本
#!/bin/sh
c:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -ExecutionPolicy Bypass -Command "C:\Users\alsritter\OneDrive\MarkDown\.git\hooks\mycommitScript.ps1"
编写一个 powershell 脚本
echo "Start synchronization";
# 如果目标文件已存在,则复制尝试失败。 若要覆盖预先存在的目标,请使用 Force 参数 :
# 还可以复制选定的项。 筛选.md
$source = "C:\Users\alsritter\OneDrive\MarkDown\";
$dest = "D:\MyBlog\source\_posts";
$exclude01 = "noCommit";
$exclude02 = ".git";
# $_:管道的中间结果
Get-ChildItem -Path $source -include *.md -Recurse | ? {-not ($_.Directory.Name -eq $exclude01 -or $_.Directory.Name -eq $exclude02)} | % {Copy-Item $_.fullname $dest -Force};
echo "synchronization OK!";
如果 ps1 脚本有编码问题,需要改成 GBK
Reference
参考资料 自定义 Git - Git 钩子